package com.xpec.c4.service.common;

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.concurrent.atomic.AtomicInteger;

public class KeyManager
{
	/**
	 * key的有效时间(此属性的单位为毫秒)
	 */
	//private int availTimeMillis;

	/**
	 * 用于存放生成的key，过期的key将会被删除。
	 */
	//private Map<String, Long> keyList = new HashMap<String, Long>();

	/**
	 * 安全随机数发生器
	 */
	private SecureRandom secureRandom = null;

//	/**
//	 * 将secureRandom发出的随机数转换为key
//	 */
//	private MessageDigest msgDigest = null;

	/**
	 * 序號，防止隨機部份重複
	 */
	private AtomicInteger serialValue;
	
	/**
	 * 构造方法。
	 * 
	 * @param availTime key的有效时间（分钟）。
	 */
	public KeyManager(long seed/*, int keyLifeSpanMilSec*/)
	{
	//	availTimeMillis = keyLifeSpanMilSec;
		try
		{
			//使用基于SHA-1的安全随机数发生器
			secureRandom = SecureRandom.getInstance("SHA1PRNG");
			secureRandom.setSeed(seed);
			
			serialValue = new AtomicInteger(0);
		}
		catch (NoSuchAlgorithmException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * 產生隨機key
	 * 
	 * @return
	 */
	public String createKey()
	{
		int nextInt = 0;
		synchronized(this)
		{
			//secure random應該thread safe，但是以防萬一
			nextInt = secureRandom.nextInt();
		}
			
		return EncryptHandler.sha1(String.valueOf(nextInt));
	}
	
	/**
	 * 產生隨機key+序號
	 * @return
	 */
	public String createKeyWithSerialNum()
	{
		int nextInt = 0;
		int newSerialValue = serialValue.incrementAndGet();
		synchronized(this)
		{
			//secure random應該thread safe，但是以防萬一
			nextInt = secureRandom.nextInt();
		}
			
		return EncryptHandler.sha1(String.valueOf(nextInt), newSerialValue);
	}
	

	

	/**
	 * 判断是否为合法的key。
	 * 
	 * @param key
	 * @return
	 */
//	public boolean isOkKey(String key)
//	{
//		synchronized (this)
//		{
//			System.out.println("key = " + key);
//			System.out.println("keyList.size() = " + keyList.size());
//			for (String k : keyList.keySet())
//			{
//				System.out.println(k);
//			}
//			return keyList.containsKey(key);
//		}
//	}
//
//	/**
//	 * 删除key。
//	 * 
//	 * @param key
//	 */
//	public void deleteKey(String key)
//	{
//		System.out.println("delete key!");
//		synchronized (this)
//		{
//			keyList.remove(key);
//		}
//	}
//
//	/**
//	 * 过期检查全部key
//	 */
//	public void expireAllKey()
//	{
//		synchronized (this)
//		{
//			Iterator<String> iter = keyList.keySet().iterator();
//			while (iter.hasNext())
//			{
//				String nextKey = iter.next();
//				if (keyList.get(nextKey) + availTimeMillis < System.currentTimeMillis())
//				{
//					System.out.println("key expired = " + nextKey);
//					iter.remove();
//				}
//			}
//		}
//	}
//
//	public int getSize()
//	{
//		synchronized (this)
//		{
//			return keyList.size();
//		}
//	}
}
